﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using produccion.clases;
using System.Data;
using Oracle.DataAccess.Client;
using System.Windows.Media.Effects;
using System.Windows.Media.Animation;
using System.ComponentModel;
//using System.ComponentModel.DataAnnotations;
namespace produccion.forms
{

    /// <summary>
    /// Lógica de interacción para Window2.xaml
    /// </summary>
    public partial class FRMManPrecios : Window
    {
        List<RegistroGrid> Lista = new List<RegistroGrid>();
        CLSLISPREP LisPre = new CLSLISPREP();
        DataTable dt = new DataTable();        

        public FRMManPrecios()
        {
            InitializeComponent();
        }

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {            
            this.Close();
        }



        private void btnGrabar_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {                
                dt = LisPre.ConsultarTodas();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Lista.Add (new RegistroGrid {CODIGO=dt.Rows[i][0].ToString().ToUpper(),NOMBRE=dt.Rows[i][1].ToString().ToUpper(),ESREFERENCIA=dt.Rows[i][2].Equals("P")?true:false,ESMATERIAL=dt.Rows[i][2].Equals("M")?true:false,ESCOSTO=dt.Rows[i][3].Equals("C")?true:false,ESPRECIO=dt.Rows[i][3].Equals("P")?true:false,ELIMINAR=false });
                }
                dgPrecios.ItemsSource = Lista ;//dt.DefaultView ;                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al cargar las listas de precios", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void dgPrecios_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
        }

        private void btnGrabar_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                RegistroGrid RgValida = new RegistroGrid();
                for (int i = 0; i < Lista.Count; i++)
                {
                    RgValida = Lista[i];
                    if (!RgValida.ESMATERIAL & !RgValida.ESREFERENCIA)
                    {
                        if (!RgValida.CODIGO.Equals(""))
                        {
                            MessageBox.Show("Se debe seleccionar si es referencia o material", "Mantenimiento de precios", MessageBoxButton.OK, MessageBoxImage.Hand);
                            return;
                        }
                    }
                    if (!RgValida.ESPRECIO & !RgValida.ESCOSTO)
                    {
                        if (!RgValida.CODIGO.Equals(""))
                        {
                            MessageBox.Show("Se debe seleccionar si es costo o precio", "Mantenimiento de precios", MessageBoxButton.OK, MessageBoxImage.Hand);
                            return;
                        } 
                    }
                }

                RegistroGrid Rg = new RegistroGrid();
                for (int i = 0; i < Lista.Count; i++)
                {
                    Rg = Lista[i];
                    if (!Rg.CODIGO.Equals(""))
                    {
                        LisPre.CODLIS_PRE = Rg.CODIGO.ToUpper();
                        LisPre.NOMLIS_PRE = Rg.NOMBRE.ToUpper();
                        LisPre.APLICAA_PRE = Rg.ESMATERIAL.Equals(true) ? "M" : "P";
                        LisPre.TIPLIS_PRE = Rg.ESPRECIO.Equals(true) ? "P" : "C";
                        if (Rg.ELIMINAR)
                        {
                            if (!LisPre.ExisteLisPreMaetarP())
                            {
                                LisPre.Eliminar();
                            }
                            else
                            {
                                MessageBox.Show("No se puede eliminar la lista de precios " + LisPre.CODLIS_PRE + " porque ya tiene referencias asociadas!", "Mantenimiento de listas de precios", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            }
                        }
                        else
                        {
                            if (LisPre.ExisteLisPre())
                            {
                                LisPre.Actualizar();
                            }
                            else
                            {
                                LisPre.Insertar();
                            }
                        }
                    }
                }
                dt.Clear();
                dt = LisPre.ConsultarTodas();
                Lista.Clear();
                dgPrecios.ItemsSource = null;
                dgPrecios.Items.Clear();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Lista.Add(new RegistroGrid { CODIGO = dt.Rows[i][0].ToString().ToUpper(), NOMBRE = dt.Rows[i][1].ToString().ToUpper(), ESREFERENCIA = dt.Rows[i][2].Equals("P") ? true : false, ESMATERIAL = dt.Rows[i][2].Equals("M") ? true : false, ESCOSTO = dt.Rows[i][3].Equals("C") ? true : false, ESPRECIO = dt.Rows[i][3].Equals("P") ? true : false, ELIMINAR = false });
                }
                dgPrecios.ItemsSource = Lista;
                new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados correctamente.", true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al grabar las listas de precios", MessageBoxButton.OK, MessageBoxImage.Error);
                new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados correctamente.", false);
            }
        }

        private void border2_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void dgPrecios_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                int i = dgPrecios.SelectedIndex;
                int j = dgPrecios.CurrentCell.Column.DisplayIndex;
                if (j.Equals(0))
                {
                    //dgPrecios.fo
                }
            }
        }

        private void dgPrecios_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        } 

    }

    
    class RegistroGrid : INotifyPropertyChanged 
    {
        Boolean esreferencia, esmaterial, escosto, esprecio, eliminar;
        string codigo, nombre;

        public string CODIGO
        {
            get 
            {
                return codigo;
            }
            set 
            {
                codigo = value.ToUpper();
            }
        }

        public string NOMBRE
        {
            get { return nombre; }
            set { nombre = value.ToUpper();
                if (nombre.Equals(""))
                {
                    MessageBox.Show("El valor del código no puede ser vacío", "Mantenimiento de listas de precio", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                }
            }

        }

        public Boolean ESREFERENCIA
        {
            get { return esreferencia; }
            set
            {
                esreferencia = value; 
            }
        }
        public Boolean ESMATERIAL
        {
            get { return esmaterial; }
            set
            {
                esmaterial = value;
            }
        }
        public Boolean ESCOSTO
        {
            get { return escosto; }
            set
            {
                escosto = value; 
            }
        }
        public Boolean ESPRECIO
        {
            get { return esprecio; }
            set
            {
                esprecio = value; 
            }
        }
        public Boolean ELIMINAR
        {
            get { return eliminar; }
            set
            {
                eliminar = value; 
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    internal class ValidarCodigo : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value != null)
            {
                if (value.ToString().Length > 2)
                {
                    return new ValidationResult(false, "El código no puede ser mayor de 2 caracteres");
                }

                CLSLISPREP LisPre=new CLSLISPREP();
                LisPre.CODLIS_PRE=value.ToString();
                if (LisPre.ExisteLisPre())
                {
                    return new ValidationResult(false, "El código de lista ya existe");
                }
            }            

            return new ValidationResult(true, null);
        }
    }

    internal class ValidarNombre : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value.ToString() == null )
            {
                return new ValidationResult(false, "El nombre no puede estar nulo");
            }
            if (value.ToString().Trim().Equals(""))
            {
                return new ValidationResult(false, "El nombre no puede estar vacío");
            }
            return new ValidationResult(true, null);
        }
    }


}

